home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PCMania 39
/
PCMania CD39_2.iso
/
pcmania
/
virus39
/
antigal.c
next >
Wrap
C/C++ Source or Header
|
1995-08-22
|
15KB
|
433 lines
/*----------------------------------------------*/
/* ANTIGAL (c) 1995 Por Javier Guerrero Díaz
/* Busca en la memoria, boot de disketes
/* y MBR del disco duro el virus GALICIA.
/* La sintaxis es: ANTIGAL <unidad>.
/* Programado con Borland C++ 4.5
/*----------------------------------------------*/
/* Javier Guerrero Díaz */
/* C/ Emilio Santacana, nº 5 */
/* 11201 - ALGECIRAS */
/* (CADIZ) */
/*-------------------------------*/
#include <stdio.h>
#include <dos.h>
#include <dir.h>
#include <conio.h>
#include <bios.h>
#include <stdlib.h>
#include <direct.h>
#include <string.h>
void intro(void);
void buscamem(void);
void busca(void);
void leeboot(void);
void errorhand(int);
void buscaenboot(void);
void mensaje(char *mensa);
void matavir(void);
void panta(void);
void fin(void);
void mal(void);
int far *direcc;
char far *memo;
char tecla,flag,unidad,cambio,buffer[512],letra;
char cadena[]={ 0x0E,0x1F,0xBB,0x3C,0x7C,0x8B,0x07,0x35,0xFF,0xFF,0x89,0x07,
0x43,0x43,0x81,0xFB };
int segmento,despl,pulsa,temp;
void main(argc,argv)
int argc;
char *argv[];
{
letra=*argv[1];
if (*argv[1]=='a' || *argv[1]=='A') unidad=0;
else if (*argv[1]=='b' || *argv[1]=='B') unidad=1;
else if (*argv[1]=='c' || *argv[1]=='C') unidad=0x80;
else if (*argv[1]=='d' || *argv[1]=='D') unidad=0x81;
else { printf("\nANTIGAL (c)1995 Por Javier Guerrero Díaz\n");
printf("Sintaxis: ANTIGAL <unidad>\n"); exit(-1); }
setcbrk(1);
_setcursortype(_NOCURSOR);
intro();
panta();
buscamem();
leeboot();
buscaenboot();
}
void matavir(void)
{
short resultado1;
int resultado2;
char head,sector;
segmento=FP_SEG(buffer); despl=FP_OFF(buffer);
if (unidad==0 || unidad==1) { sector=3; head=1; }
else { sector=6; head=0; }
window(1,1,80,25); textattr(WHITE|BLUE<<4); gotoxy(24,23);
cprintf(" ");
gotoxy(24,23); cprintf("Leyendo boot original ..."); sleep(1);
gotoxy(24,23);
cprintf(" ");
asm mov ah,0
asm mov dl,byte ptr unidad
asm int 13h
resultado1=_AH;
if (resultado1 !=0) errorhand(resultado1);
asm mov ah,15h
asm mov dl,byte ptr unidad
asm int 13h
asm mov byte ptr cambio,ah
asm mov ah,2
asm mov dl,byte ptr unidad
asm mov dh,byte ptr head
asm mov ch,0
asm mov cl,byte ptr sector
asm mov al,1
asm mov es,segmento
asm mov bx,despl
asm int 13h
asm mov resultado2,ax
if (unidad==0 && resultado2 !=0x0001)
errorhand(resultado2);
else if (unidad==1 && resultado2 !=0x0001)
errorhand(resultado2);
else if (unidad==0x80 && resultado2!=0)
errorhand(resultado2);
else if (unidad==0x81 && resultado2!=0)
errorhand(resultado2);
window(1,1,80,25); textattr(WHITE|BLUE<<4); gotoxy(24,23);
cprintf(" ");
gotoxy(24,23); cprintf("Restaurando boot original ..."); sleep(1);
gotoxy(24,23);
cprintf(" ");
asm mov ah,3
asm mov dl,byte ptr unidad
asm mov dh,0
asm mov ch,0
asm mov cl,1
asm mov al,1
asm mov es,segmento
asm mov bx,despl
asm int 13h
asm mov resultado2,ax
if (unidad==0 && resultado2 !=0x0001)
errorhand(resultado2);
else if (unidad==1 && resultado2 !=0x0001)
errorhand(resultado2);
else if (unidad==0x80 && resultado2!=0)
errorhand(resultado2);
else if (unidad==0x81 && resultado2!=0)
errorhand(resultado2);
window(1,1,80,25); textattr(WHITE|BLUE<<4); gotoxy(24,23);
cprintf(" ");
gotoxy(24,23); cprintf("OK. Virus GALICIA eliminado."); sleep(1);
gotoxy(24,23);
cprintf(" ");
}
void buscaenboot(void)
{
direcc=&buffer[0x01B3];
if (*direcc==0x3156)
{
window(17,7,63,15); textattr(YELLOW|RED<<4); putch(7);
cprintf("╔═════════════════════════════════════════════╗");
cprintf("║ Atención: Encontrada marca de infección ║");
cprintf("║ del virus GALICIA en el sector de arranque ║");
cprintf("║ de la unidad %c: . Para mayor seguridad, ║",letra);
cprintf("║ ANTIGAL analizará el código en busca de ║");
cprintf("║ la rutina de encriptado propia del ║");
cprintf("║ virus GALICIA. ║");
cprintf("╚═════════════════════════════════════════════╝");
mensaje("Encontrada marca de infección del virus."); sleep(5);
memo=&buffer[0x27];
for (temp=0;temp<sizeof cadena;temp++)
{
if (*memo!=cadena[temp]) goto noinfec;
else memo++;
}
window(17,7,63,15); textattr(WHITE|RED<<4); putch(7);
cprintf("╔═════════════════════════════════════════════╗");
cprintf("║ Atención: Encontrada rutina de encriptación ║");
cprintf("║ propia del virus GALICIA, en el boot sector ║");
cprintf("║ de la unidad %c: . ║",letra);
cprintf("║ Esta unidad se encuentra infectada por ║");
cprintf("║ el virus. Pulse 'SUPR' para eliminarlo ║");
cprintf("║ o cualquier tecla para analizar otro disco. ║");
cprintf("╚═════════════════════════════════════════════╝");
mensaje("¡ Sector de arranque infectado !");
pulsa=bioskey(0);
switch (pulsa)
{
case 283: fin();
break;
case 0x5300: matavir();
goto tecl;
default: goto tecl;
}
noinfec: window(17,7,63,19);
cprintf("╔═════════════════════════════════════════════╗");
cprintf("║ Aviso: No se ha encontrado la rutina de ║");
cprintf("║ encriptado del virus GALICIA. Puede ser una ║");
cprintf("║ falsa alarma o bien puede tratarse de una ║");
cprintf("║ variante del virus cuya rutina de en- ║");
cprintf("║ criptado sea diferente. En cualquier caso ║");
cprintf("║ este sector de arranque es dudoso; es reco- ║");
cprintf("║ mendable limpiarlo, a menos que se tenga la ║");
cprintf("║ seguridad de que el disco no está infectado.║");
cprintf("║ ║");
cprintf("║ Pulse una tecla para analizar otro disco. ║");
cprintf("╚═════════════════════════════════════════════╝");
mensaje("Falsa alarma o variante del virus.");
}
else { window(17,7,63,15); textattr(WHITE|CYAN<<4);
cprintf("╔═════════════════════════════════════════════╗");
cprintf("║ OK! El sector de arranque de la unidad %c: ║",letra);
cprintf("║ no contiene la marca de infección del virus ║");
cprintf("║ GALICIA. Esta unidad está limpia. ║");
cprintf("║ Pulse una tecla para comprobar otro disco ║");
cprintf("║ o vuelva a ejecutar ANTIGAL para chequear ║");
cprintf("║ una unidad de disco diferente a la actual. ║");
cprintf("╚═════════════════════════════════════════════╝");
window(1,1,80,25); textattr(WHITE|BLUE<<4); gotoxy(24,23);
cprintf(" ");
gotoxy(24,23); cprintf("OK. Disco limpio.");
sleep(1); gotoxy(24,23);
cprintf(" ");
}
pulsa=bioskey(0);
tecl: switch (pulsa)
{
case 283: fin();
default: panta();
leeboot();
buscaenboot();
}
}
void leeboot(void)
{
short resultado1;
int resultado2;
segmento=FP_SEG(buffer); despl=FP_OFF(buffer);
direcc=(char far *)MK_FP(segmento,despl+0x52);
window(1,1,80,25); textattr(WHITE|BLUE<<4); gotoxy(24,23);
cprintf(" ");
gotoxy(24,23); cprintf("Leyendo boot..."); sleep(1);
gotoxy(24,23);
cprintf(" ");
asm mov ah,0
asm mov dl,byte ptr unidad
asm int 13h
resultado1=_AH;
if (resultado1 !=0) errorhand(resultado1);
asm mov ah,15h
asm mov dl,byte ptr unidad
asm int 13h
asm mov byte ptr cambio,ah
asm mov ah,2
asm mov dl,byte ptr unidad
asm mov dh,0
asm mov ch,0
asm mov cl,1
asm mov al,1
asm mov es,segmento
asm mov bx,despl
asm int 13h
asm mov resultado2,ax
if (unidad==0 && resultado2 !=0x0001)
errorhand(resultado2);
else if (unidad==1 && resultado2 !=0x0001)
errorhand(resultado2);
else if (unidad==0x80 && resultado2!=0)
errorhand(resultado2);
else if (unidad==0x81 && resultado2!=0)
errorhand(resultado2);
}
void buscamem(void)
{
window(18,7,62,11);
textattr(WHITE|BLUE<<4);
cprintf("╔═══════════════════════════════════════════╗");
cprintf("║ Atención: Buscando virus GALICIA en RAM. ║");
cprintf("║ Analizando la memoria .... ║");
cprintf("╚═══════════════════════════════════════════╝");
sleep(1);
busca();
}
void busca(void)
{
char far *cop;
char dummy;
direcc=(int far *)MK_FP(0x0000,0x0413);
segmento=*direcc*64; segmento-=0x07C0; despl=0x7C27;
memo=(char far *)MK_FP(segmento,despl);
cop=(char far *)MK_FP(segmento,0x7C00);
for (temp=0;temp<sizeof cadena;temp++)
{
if (*memo!=cadena[temp]) goto noresid;
else memo++;
}
window(14,7,66,21); textattr(YELLOW|RED<<4);
putch(7);
cprintf("╔═══════════════════════════════════════════════════╗");
cprintf("║ Atención: Virus GALICIA detectado en la ║");
cprintf("║ dirección de memoria : %X:7C00 ║",segmento);
cprintf("╟───────────────────────────────────────────────────╢");
cprintf("║ ║");
cprintf("║ ║");
cprintf("║ ║");
cprintf("║ ║");
cprintf("║ ║");
cprintf("║ ║");
cprintf("║ ║");
cprintf("║ ║");
cprintf("║ ║");
cprintf("╚═══════════════════════════════════════════════════╝");
window(15,11,65,20); textattr(WHITE|RED<<4);
for (temp=0;temp<459;temp++)
{ dummy=*cop; if (dummy<32) dummy='.'; cprintf("%c",dummy); cop++; }
mensaje("¡ Virus encontrado en memoria !"); textattr(LIGHTGRAY|BLACK<<4);
sleep(5); clrscr(); panta();
window(17,7,63,15);
cprintf("╔═════════════════════════════════════════════╗");
cprintf("║ Aviso: El virus se encuentra en memoria. ║");
cprintf("║ Aunque el programa continuará su ejecucion, ║");
cprintf("║ se recomienda arrancar con un disco limpio ║");
cprintf("║ y ejecutar de nuevo ANTIGAL. ║");
cprintf("║ ║");
cprintf("║ ║");
cprintf("╚═════════════════════════════════════════════╝");
window(23,13,62,13); textattr(YELLOW|BLUE<<4);
cprintf("Analizando boot de unidad %c: .....",letra); sleep(1);
leeboot(); buscaenboot();
noresid:
window(18,7,62,11);
cprintf("╔═══════════════════════════════════════════╗");
cprintf("║ OK !. No se encontró el virus en RAM. ║");
cprintf("║ Analizando boot de unidad %c: .... ║",letra);
cprintf("╚═══════════════════════════════════════════╝");
}
void intro(void)
{
clrscr(); gotoxy(20,9); textattr(YELLOW|BLUE<<4);
cprintf("╔═════════════════════════════════════╗\n"); gotoxy(20,10);
cprintf("║ ANTIGAL ║\n"); gotoxy(20,11);
cprintf("║ (c) 1995 Por Javier Guerrero Diaz. ║\n"); gotoxy(20,12);
cprintf("║ Rastrea el sector de arranque de la ║\n"); gotoxy(20,13);
cprintf("║ unidad especificada como parámetro ║\n"); gotoxy(20,14);
cprintf("║ en busca del virus GALICIA. ║\n"); gotoxy(20,15);
cprintf("╚═════════════════════════════════════╝\n");
textattr(LIGHTGRAY|BLACK<<4);tecla=getch();
clrscr();
}
void fin(void)
{
window(1,1,80,25); textattr(WHITE|BLUE<<4); gotoxy(24,23);
cprintf(" ");
gotoxy(24,23); cprintf("PROGRAMA FINALIZADO.");
_setcursortype(_NORMALCURSOR); textattr(LIGHTGRAY|BLACK<<4);
gotoxy(24,1);
exit(0);
}
void mal(void)
{
window(1,1,80,25); textattr(WHITE|BLUE<<4); gotoxy(24,23);
cprintf(" ");
gotoxy(24,23); cprintf("PROGRAMA FINALIZADO ANORMALMENTE.");
_setcursortype(_NORMALCURSOR); textattr(LIGHTGRAY|BLACK<<4);
gotoxy(24,1);
exit(-1);
}
void errorhand(numerror)
int numerror;
{
switch(numerror)
{
case 0x0100: mensaje("Error: Función no permitida.");
break;
case 0x0200: mensaje("Error: Marca de direcciones no encontrada.");
break;
case 0x0300: mensaje("Error: Disquete protegido contra escritura.");
break;
case 0x0400: mensaje("Error: Sector no encontrado.");
break;
case 0x0600:
if (cambio!=2)
{ mensaje("Error: Disco retirado, pulsa tecla para repetir lectura.");
getch(); }
leeboot(); buscaenboot();
break;
case 0x0800: mensaje("Error: Desbordamiento de DMA.");
break;
case 0x0900: cprintf("Error: Superado el límite de 64k de segmento.");
break;
case 0x0c00: mensaje("Error: Tipo de entorno no hallado.");
break;
case 0x1000: mensaje("Error: Fallo de lectura.");
break;
case 0x2000: mensaje("Error: Fallo de controladora de disco.");
break;
case 0x4000: mensaje("Error: Pista no encontrada.");
break;
case 0x8000: mensaje("Error: Time Out; unidad no responde.");
break;
default: mensaje("Error: Fallo general.");
break;
}
mal();
}
void mensaje(mensa)
char mensa[50];
{
window(1,1,80,25); textattr(WHITE|BLUE<<4); gotoxy(24,23);
cprintf(" ");
gotoxy(24,23); cprintf("%s",mensa); putch(7);
sleep(1); gotoxy(24,23);
cprintf(" ");
}
void panta(void)
{
window(20,2,60,7);
gotoxy(1,1);
textattr(YELLOW|BLUE<<4);
cprintf("╔═══════════════════════════════════════╗");
cprintf("║ ANTIGAL: DETECTOR DE VIRUS GALICIA ║");
cprintf("║ (C) Por Javier Guerrero Diaz ║");
cprintf("╚═══════════════════════════════════════╝");
window(1,22,80,25);
cprintf("╔══════════════════════════════════════════════════════════════════════════════╗");
cprintf("║ RESULTADO OPERACION: ║");
cprintf("╚══════════════════════════════════════════════════════════════════════════════╝");
textattr(WHITE|BLUE<<4); window(1,1,80,25);
}